package com.videoaggre.zcl.ui.widget

import android.content.Context
import android.graphics.Matrix
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatImageView
import com.videoaggre.zcl.R
import com.videoaggre.zcl.utils.Logger

class ImageViewExt : AppCompatImageView {
    companion object {
        const val SCALE_TYPE_MATRIX_BOTTOM_CROP = 1 // 等比例缩放，当图像超出控件尺寸时，保留下边，其余部分剪切掉。
        const val SCALE_TYPE_MATRIX_TOP_CROP = 2 // 等比例缩放，当图像超出控件尺寸时，保留上边，其余部分剪切掉。

    }

    private var mScaleTypeMatrixExt = -1

    constructor(context: Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init(attrs)
    }

    private fun init(attrs: AttributeSet?) {
        if (attrs != null) {
            val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ImageViewExt)
            mScaleTypeMatrixExt = typedArray.getInt(R.styleable.ImageViewExt_ive_scale_type_matrix_ext, mScaleTypeMatrixExt)
            typedArray.recycle()
        }
    }

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        handScaleTypeMatrixExt()
    }

    private fun handScaleTypeMatrixExt() {
        if (scaleType == ScaleType.MATRIX && mScaleTypeMatrixExt != -1) {
            Logger.e("handScaleTypeMatrixExt==>${drawable}")
            // 图片实际尺寸
            if (drawable == null) return
            val dwidth = drawable.intrinsicWidth // 750
            val dheight = drawable.intrinsicHeight // 1500
            Logger.e("dwidth==>${dwidth}<==dheight==>${dheight}")
            // ImageView图片显示尺寸
            val vwidth = width - paddingLeft - paddingRight // 720
            val vheight = height - paddingTop - paddingBottom // 1280
            Logger.e("vwidth==>${vwidth}<==vheight==>${vheight}")
            if (dwidth == 0 || dheight == 0 || vwidth == 0 || vheight == 0) return
            val scale = vwidth.toFloat() / dwidth.toFloat()
            val dx = 0f
            var dy = 0f
            when (mScaleTypeMatrixExt) {
                SCALE_TYPE_MATRIX_BOTTOM_CROP -> dy = vheight - dheight * scale
                SCALE_TYPE_MATRIX_TOP_CROP -> {
                }
            }
            val matrix = Matrix()
            matrix.setScale(scale, scale)
            matrix.postTranslate(dx, dy)
            imageMatrix = matrix
        }
    }

    fun setScaleTypeMatrixExt(scaleTypeMatrixExt: Int) {
        mScaleTypeMatrixExt = scaleTypeMatrixExt
        requestLayout()
    }
}